/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.easoftware.code.mb;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import net.easoftware.code.beans.ComboItem;
import net.easoftware.code.beans.facade.LineaNegocio;
import net.easoftware.code.beans.facade.PerfilDatosFc;
import net.easoftware.code.beans.facade.UnidadNegocio;
import net.easoftware.code.beans.jpa.PerfilDatos;
import net.easoftware.code.beans.jpa.PerfilDatosLineanegocio;
import net.easoftware.code.beans.jpa.PerfilDatosUnidadnegocio;
import net.easoftware.code.dao.CatalogosDao;
import net.easoftware.code.dao.PersistenceEjb;
import net.easoftware.code.error.EaError;
import net.easoftware.code.mb.annotation.GenericMaintenanceConfig;
import net.easoftware.code.util.Tools;
import org.apache.commons.beanutils.BeanUtils;

/**
 *
 * @author eliu
 */
@SessionScoped
@Named
@GenericMaintenanceConfig(actions = {GenericMaintenanceConfig.NEW, GenericMaintenanceConfig.DEL}, title = "Mantenimiento de Perfiles de Datos")
public class MbPerfilesDatos implements Serializable, GenericMaintenanceWrapper {

    private List<ComboItem> estados = new LinkedList<>();
    private List<PerfilDatosFc> lista = new LinkedList<>();
    @Inject
    private PerfilDatosFc bean;
    private PerfilDatosFc selected;
    @Inject
    CatalogosDao catalogosDao;
    @EJB
    PersistenceEjb ejb;
    private List<LineaNegocio> lineasNegocio;
    private List<UnidadNegocio> unidadesNegocios;

    public List<LineaNegocio> getLineasNegocio() {
        if (lineasNegocio == null || lineasNegocio.isEmpty()) {
            try {
                lineasNegocio = catalogosDao.getAllVisibleLineasNegocio();
            }
            catch (EaError ex) {
                Logger.getLogger(MbPerfilesDatos.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return lineasNegocio;
    }

    public void setLineasNegocio(List<LineaNegocio> lineasNegocio) {
        this.lineasNegocio = lineasNegocio;
    }

    public List<UnidadNegocio> getUnidadesNegocios() {
        if (unidadesNegocios == null || unidadesNegocios.isEmpty()) {
            try {
                unidadesNegocios = catalogosDao.getAllVisibleUnidadesNegocio();
            }
            catch (EaError ex) {
                Logger.getLogger(MbPerfilesDatos.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return unidadesNegocios;
    }

    public void setUnidadesNegocios(List<UnidadNegocio> unidadesNegocios) {
        this.unidadesNegocios = unidadesNegocios;
    }

    public PerfilDatosFc getSelected() {
        return selected;
    }

    public void setSelected(PerfilDatosFc selected) {
        this.selected = selected;
    }

    public List<ComboItem> getEstados() {
        if (estados.isEmpty()) {
            estados = Tools.getEstados();
        }
        return estados;
    }

    public void setEstados(List<ComboItem> estados) {
        this.estados = estados;
    }

    public List<PerfilDatosFc> getLista() {
        if (this.lista == null || this.lista.isEmpty()) {
            this.lista = new LinkedList<>();

            List<PerfilDatos> l = catalogosDao.getAllFromEntity(PerfilDatos.class);
            for (PerfilDatos pd : l) {
                try {
                    PerfilDatosFc pdfc = (PerfilDatosFc) Tools.cloneObject(pd, PerfilDatosFc.class);
                    pdfc.setRef(pd);
                    List<PerfilDatosLineanegocio> perfilDatosLineanegocioList = pd.getPerfilDatosLineanegocioList();
                    for (PerfilDatosLineanegocio pdln : perfilDatosLineanegocioList) {
                        pdfc.getLineas().add((LineaNegocio) Tools.cloneObject(pdln.getLineanegocio(), LineaNegocio.class));
                    }
                    List<PerfilDatosUnidadnegocio> perfilDatosUnidadnegocioList = pd.getPerfilDatosUnidadnegocioList();
                    for (PerfilDatosUnidadnegocio pdun : perfilDatosUnidadnegocioList) {
                        pdfc.getUnidades().add((UnidadNegocio) Tools.cloneObject(pdun.getUnidadnegocio(), UnidadNegocio.class));
                    }
                    lista.add(pdfc);
                }
                catch (EaError ex) {
                    Logger.getLogger(MbPerfilesDatos.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return lista;
    }

    public void remTodasUnidades() {
        this.bean.getUnidades().clear();
    }

    public void remTodasLineas() {
        this.bean.getLineas().clear();
    }

    public void addTodosUnidades() {
        try {
            this.bean.getUnidades().clear();
            this.bean.getUnidades().addAll(catalogosDao.getAllVisibleUnidadesNegocio());
        }
        catch (EaError ex) {
            Logger.getLogger(MbPerfilesDatos.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void addTodasLineas() {
        try {
            this.bean.getLineas().clear();
            this.bean.getLineas().addAll(catalogosDao.getAllVisibleLineasNegocio());
        }
        catch (EaError ex) {
            Logger.getLogger(MbPerfilesDatos.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void setLista(List<PerfilDatosFc> lista) {
        this.lista = lista;
    }

    @Override
    public void actionSave() throws EaError {
        PerfilDatos pd = (PerfilDatos) ejb.guardar(bean.getEntityBean());
        pd.setPerfilDatosLineanegocioList(new LinkedList<PerfilDatosLineanegocio>());
        pd.setPerfilDatosUnidadnegocioList(new LinkedList<PerfilDatosUnidadnegocio>());
        for (LineaNegocio ln : bean.getLineas()) {
            PerfilDatosLineanegocio lnn = new PerfilDatosLineanegocio();
            lnn.setPerfilDagos(pd);
            lnn.setLineanegocio((net.easoftware.code.beans.jpa.LineaNegocio) ln.getEntityBean());
            pd.getPerfilDatosLineanegocioList().add(lnn);
        }
        for (UnidadNegocio ln : bean.getUnidades()) {
            PerfilDatosUnidadnegocio unn = new PerfilDatosUnidadnegocio();
            unn.setPerfilDatos(pd);
            unn.setUnidadnegocio((net.easoftware.code.beans.jpa.UnidadNegocio) ln.getEntityBean());
            pd.getPerfilDatosUnidadnegocioList().add(unn);

        }
        ejb.actualizar(pd);
        lista = new LinkedList<>();
    }

    @Override
    public void actionUpdate() throws EaError {
        for (PerfilDatosLineanegocio pln : bean.getRef().getPerfilDatosLineanegocioList()) {
            ejb.eliminar(pln);
        }
        for (PerfilDatosUnidadnegocio pun : bean.getRef().getPerfilDatosUnidadnegocioList()) {
            ejb.eliminar(pun);
        }
        PerfilDatos pd = (PerfilDatos) bean.getEntityBean();
        pd.setPerfilDatosLineanegocioList(new LinkedList<PerfilDatosLineanegocio>());
        pd.setPerfilDatosUnidadnegocioList(new LinkedList<PerfilDatosUnidadnegocio>());
        for (LineaNegocio ln : bean.getLineas()) {
            PerfilDatosLineanegocio lnn = new PerfilDatosLineanegocio();
            lnn.setPerfilDagos(pd);
            lnn.setLineanegocio((net.easoftware.code.beans.jpa.LineaNegocio) ln.getEntityBean());
            pd.getPerfilDatosLineanegocioList().add(lnn);
        }
        for (UnidadNegocio ln : bean.getUnidades()) {
            PerfilDatosUnidadnegocio unn = new PerfilDatosUnidadnegocio();
            unn.setPerfilDatos(pd);
            unn.setUnidadnegocio((net.easoftware.code.beans.jpa.UnidadNegocio) ln.getEntityBean());
            pd.getPerfilDatosUnidadnegocioList().add(unn);
        }
        ejb.actualizar(pd);

        lista = new LinkedList<>();
    }

    @Override
    public void actionDelete() throws EaError {
        ejb.eliminar(bean.getEntityBean());
        lista = new LinkedList<>();
    }

    @Override
    public void actionNew() throws EaError {
        bean.setId(0);
        bean.setDescripcion("");

    }

    @Override
    public void toExcel() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void toPDF() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getFormPage() {
        return "/module/perfilesdatos/perfildatos.xhtml";
    }

    @Override
    public String getGridPage() {
        return "/module/perfilesdatos/perfilesdatos.xhtml";
    }

    @Override
    public void actionSelect() throws EaError {
        try {
            BeanUtils.copyProperties(this.bean, this.selected);
        }
        catch (IllegalAccessException | InvocationTargetException ex) {
            throw new EaError("Error seleccionando perfil", ex);
        }
    }

    @Override
    public void actionCustom1() throws EaError {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actionCustom2() throws EaError {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getActionCustom1Label() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getActionCustom2Label() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean isEnabledActionCustom1() {
        return false;
    }

    @Override
    public boolean isEnabledActionCustom2() {
        return false;
    }
}
